﻿#nullable enable

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Microsoft.Extensions.Localization;
using PHMEE.Localization;

namespace PHMEE.EnergyEfficiency;

public sealed class LogAbstractDto : IValidatableObject
{
    public DateTime Ts { get; set; }

    #region Vessel

    /// <summary>
    /// IMO 号，7 位数字
    /// </summary>
    [Required]
    [Range(0, int.MaxValue)]
    public int IMO { get; set; }

    #endregion Vessel

    #region Date Time

    /// <summary>
    /// UTC 日期，格式 '2024-03-04'
    /// </summary>
    [Required]
    public DateOnly DateUTC { get; set; }

    /// <summary>
    /// UTC 时间（精确到分钟），格式 '08:08:00'
    /// </summary>
    [Required]
    public TimeOnly TimeUTC { get; set; }

    #endregion Date Time

    #region Voyage

    /// <summary>
    /// 航次的出发港 Code
    /// </summary>
    [Required]
    [StringLength(5)]
    public string VoyageFrom { get; set; } = null!;

    /// <summary>
    /// 航次的目的地港 Code
    /// </summary>
    // [Required]
    [StringLength(5)]
    public string? VoyageTo { get; set; } = null!;

    /// <summary>
    /// 航次号
    /// </summary>
    [Required]
    public string VoyageNumber { get; set; } = null!;

    /// <summary>
    /// 停租的原因
    /// </summary>
    [StringLength(100)]
    public string? OffhireReasons { get; set; }

    #endregion Voyage

    #region Event

    /// <summary>
    /// 事件
    /// </summary>
    [Required]
    public LogAbstractEventType Event { get; set; }

    #endregion Event

    #region Time elapsed

    /// <summary>
    /// 距离上次事件报告的时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeSincePreviousReport { get; set; }

    /// <summary>
    /// 海速时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeElapsedSailing { get; set; }

    /// <summary>
    /// 锚地时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeElapsedAnchoring { get; set; }

    /// <summary>
    /// 动力定位时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeElapsedDP { get; set; }

    /// <summary>
    /// 冰区航行时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeElapsedIce { get; set; }

    /// <summary>
    /// 机动行驶时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeElapsedManeuvering { get; set; }

    /// <summary>
    /// 等待时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeElapsedWaiting { get; set; }

    /// <summary>
    /// 装卸货时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeElapsedLoadingUnloading { get; set; }

    /// <summary>
    /// 漂流时间（h）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float TimeElapsedDrifting { get; set; }

    #endregion Time elapsed

    #region Distance

    /// <summary>
    /// 自上次报告以来航行的总距离（对地距离）。当船舶系泊（在泊位或锚地）时，该值不应大于 0。
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float Distance { get; set; }

    #endregion Distance

    #region Position

    /// <summary>
    /// 纬度-度
    /// </summary>
    // [Required]
    public int LatitudeDegree { get; set; }

    /// <summary>
    /// 纬度-分
    /// </summary>
    // [Required]
    public float LatitudeMinutes { get; set; }

    /// <summary>
    /// 纬度-南北
    /// </summary>
    // [Required]
    public LatitudeNorthSouth LatitudeNorthSouth { get; set; }

    /// <summary>
    /// 经度-度
    /// </summary>
    // [Required]
    public int LongitudeDegree { get; set; }

    /// <summary>
    /// 经度-分
    /// </summary>
    // [Required]
    public float LongitudeMinutes { get; set; }

    /// <summary>
    /// 经度-东西
    /// </summary>
    // [Required]
    public LongitudeEastWest LongitudeEastWest { get; set; }

    #endregion Position

    #region Cargo

    /// <summary>
    /// 货物-公吨 mt
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoMt { get; set; }

    /// <summary>
    /// 货物-体积 m3
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoM3 { get; set; }

    /// <summary>
    /// 人数
    /// </summary>
    // [Required]
    [Range(0, int.MaxValue)]
    public int Passengers { get; set; }

    /// <summary>
    /// 货物-汽车当量单位 CEU
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoCEU { get; set; }

    /// <summary>
    /// 总 TEU
    /// </summary>
    // [Required]
    [Range(0, int.MaxValue)]
    public int CargoTotalTEU { get; set; }

    /// <summary>
    /// 总满载 TEU
    /// </summary>
    // [Required]
    [Range(0, int.MaxValue)]
    public int CargoTotalFullTEU { get; set; }

    /// <summary>
    /// 冷却型冷藏集装箱 满载 TEU
    /// </summary>
    // [Required]
    [Range(0, int.MaxValue)]
    public int CargoFullReeferTEU { get; set; }

    /// <summary>
    /// 20 英尺的冷却型冷藏集装箱的数量
    /// </summary>
    // [Required]
    [Range(0, int.MaxValue)]
    public int Reefer20Chilled { get; set; }

    /// <summary>
    /// 40 英尺的冷却型冷藏集装箱的数量
    /// </summary>
    // [Required]
    [Range(0, int.MaxValue)]
    public int Reefer40Chilled { get; set; }

    /// <summary>
    /// 20 英尺的冷冻型冷藏集装箱的数量
    /// </summary>
    // [Required]
    [Range(0, int.MaxValue)]
    public int Reefer20Frozen { get; set; }

    /// <summary>
    /// 40 英尺的冷冻型冷藏集装箱的数量
    /// </summary>
    // [Required]
    [Range(0, int.MaxValue)]
    public int Reefer40Frozen { get; set; }

    #endregion Cargo

    #region Consumption

    #region Main engines Consumption

    /// <summary>
    /// 主机 HFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionHFO { get; set; }

    /// <summary>
    /// 主机 LFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionLFO { get; set; }

    /// <summary>
    /// 主机 MGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionMGO { get; set; }

    /// <summary>
    /// 主机 MDO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionMDO { get; set; }

    /// <summary>
    /// 主机 LSHFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionLSHFO { get; set; }

    /// <summary>
    /// 主机 LSLFO消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionLSLFO { get; set; }

    /// <summary>
    /// 主机 LSMGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionLSMGO { get; set; }

    /// <summary>
    /// 主机 ULSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionULSFO2020 { get; set; }

    /// <summary>
    /// 主机 ULSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionULSLFO2020 { get; set; }

    /// <summary>
    /// 主机 ULSMDO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionULSMDO2020 { get; set; }

    /// <summary>
    /// 主机 ULSMGO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionULSMGO2020 { get; set; }

    /// <summary>
    /// 主机 VLSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionVLSFO2020 { get; set; }

    /// <summary>
    /// 主机 VLSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionVLSLFO2020 { get; set; }

    /// <summary>
    /// 主机 LPGP 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionLPGP { get; set; }

    /// <summary>
    /// 主机 LPGB 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionLPGB { get; set; }

    /// <summary>
    /// 主机 LNG 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionLNG { get; set; }

    /// <summary>
    /// 主机 Methanol 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionM { get; set; }

    /// <summary>
    /// 主机 Ethanol 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionE { get; set; }

    /// <summary>
    /// 主机其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MEConsumptionO { get; set; }

    /// <summary>
    /// 主机其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? MEConsumptionOType { get; set; }

    #endregion MainEngine Consumption

    #region Aux Engines Consumption

    /// <summary>
    /// 副机 HFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionHFO { get; set; }

    /// <summary>
    /// 副机 LFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionLFO { get; set; }

    /// <summary>
    /// 副机 MGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionMGO { get; set; }

    /// <summary>
    /// 副机 MDO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionMDO { get; set; }

    /// <summary>
    /// 副机 LSHFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionLSHFO { get; set; }

    /// <summary>
    /// 副机 LSLFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionLSLFO { get; set; }

    /// <summary>
    /// 副机 LSMGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionLSMGO { get; set; }

    /// <summary>
    /// 副机 ULSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionULSFO2020 { get; set; }

    /// <summary>
    /// 副机 ULSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionULSLFO2020 { get; set; }

    /// <summary>
    /// 副机 ULSMDO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionULSMDO2020 { get; set; }

    /// <summary>
    /// 副机 ULSMGO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionULSMGO2020 { get; set; }

    /// <summary>
    /// 副机 VLSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionVLSFO2020 { get; set; }

    /// <summary>
    /// 副机 VLSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionVLSLFO2020 { get; set; }

    /// <summary>
    /// 副机 LPGP 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionLPGP { get; set; }

    /// <summary>
    /// 副机 LPGB 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionLPGB { get; set; }

    /// <summary>
    /// 副机 LNG 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionLNG { get; set; }

    /// <summary>
    /// 副机 Methanol 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionM { get; set; }

    /// <summary>
    /// 副机 Ethanol 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionE { get; set; }

    /// <summary>
    /// 副机其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEConsumptionO { get; set; }

    /// <summary>
    /// 副机其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? AEConsumptionOType { get; set; }

    #region AE Emergency Consumption

    /// <summary>
    /// 副机应急 HFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsHFO { get; set; }

    /// <summary>
    /// 副机应急 LFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsLFO { get; set; }

    /// <summary>
    /// 副机应急 MGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsMGO { get; set; }

    /// <summary>
    /// 副机应急 MDO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsMDO { get; set; }

    /// <summary>
    /// 副机应急 LSHFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsLSHFO { get; set; }

    /// <summary>
    /// 副机应急 LSLFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsLSLFO { get; set; }

    /// <summary>
    /// 副机应急 LSMGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsLSMGO { get; set; }

    /// <summary>
    /// 副机应急 ULSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsULSFO2020 { get; set; }

    /// <summary>
    /// 副机应急 ULSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsULSLFO2020 { get; set; }

    /// <summary>
    /// 副机应急 ULSMDO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsULSMDO2020 { get; set; }

    /// <summary>
    /// 副机应急 ULSMGO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsULSMGO2020 { get; set; }

    /// <summary>
    /// 副机应急 VLSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsVLSFO2020 { get; set; }

    /// <summary>
    /// 副机应急 VLSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsVLSLFO2020 { get; set; }

    /// <summary>
    /// 副机应急 LPGP 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsLPGP { get; set; }

    /// <summary>
    /// 副机应急 LPGB 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsLPGB { get; set; }

    /// <summary>
    /// 副机应急 LNG 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsLNG { get; set; }

    /// <summary>
    /// 副机应急 Methanol 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsM { get; set; }

    /// <summary>
    /// 副机应急 Ethanol 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsE { get; set; }

    /// <summary>
    /// 副机应急其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float AEEmrgConsO { get; set; }

    /// <summary>
    /// 副机应急其它油品类型
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public string? AEEmrgConsOType { get; set; }

    #endregion AE Emergency Consumption

    #endregion Aux Engines Consumption

    #region Boilers Consumption

    /// <summary>
    /// 锅炉 HFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionHFO { get; set; }

    /// <summary>
    /// 锅炉 LFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionLFO { get; set; }

    /// <summary>
    /// 锅炉 MGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionMGO { get; set; }

    /// <summary>
    /// 锅炉 MDO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionMDO { get; set; }

    /// <summary>
    /// 锅炉 LSHFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionLSHFO { get; set; }

    /// <summary>
    /// 锅炉 LSLFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionLSLFO { get; set; }

    /// <summary>
    /// 锅炉 LSMGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionLSMGO { get; set; }

    /// <summary>
    /// 锅炉 ULSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionULSFO2020 { get; set; }

    /// <summary>
    /// 锅炉 ULSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionULSLFO2020 { get; set; }

    /// <summary>
    /// 锅炉 ULSMDO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionULSMDO2020 { get; set; }

    /// <summary>
    /// 锅炉 ULSMGO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionULSMGO2020 { get; set; }

    /// <summary>
    /// 锅炉 VLSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionVLSFO2020 { get; set; }

    /// <summary>
    /// 锅炉 VLSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionVLSLFO2020 { get; set; }

    /// <summary>
    /// 锅炉 LPGP 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionLPGP { get; set; }

    /// <summary>
    /// 锅炉 LPGB 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionLPGB { get; set; }

    /// <summary>
    /// 锅炉 LNG 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionLNG { get; set; }

    /// <summary>
    /// 锅炉 Methanol 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionM { get; set; }

    /// <summary>
    /// 锅炉 Ethanol 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionE { get; set; }

    /// <summary>
    /// 锅炉其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float BoilerConsumptionO { get; set; }

    /// <summary>
    /// 锅炉其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? BoilerConsumptionOType { get; set; }

    #endregion Boilers Consumption

    #region Inert Gas Consumption

    /// <summary>
    /// 惰性气体 HFO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionHFO { get; set; }

    /// <summary>
    /// 惰性气体 LFO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionLFO { get; set; }

    /// <summary>
    /// 惰性气体 MGO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionMGO { get; set; }

    /// <summary>
    /// 惰性气体 MDO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionMDO { get; set; }

    /// <summary>
    /// 惰性气体 LSHFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionLSHFO { get; set; }

    /// <summary>
    /// 惰性气体 LSLFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionLSLFO { get; set; }

    /// <summary>
    /// 惰性气体 LSMGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionLSMGO { get; set; }

    /// <summary>
    /// 惰性气体 ULSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionULSFO2020 { get; set; }

    /// <summary>
    /// 惰性气体 ULSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionULSLFO2020 { get; set; }

    /// <summary>
    /// 惰性气体 ULSMDO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionULSMDO2020 { get; set; }

    /// <summary>
    /// 惰性气体 ULSMGO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionULSMGO2020 { get; set; }

    /// <summary>
    /// 惰性气体 VLSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionVLSFO2020 { get; set; }

    /// <summary>
    /// 惰性气体 VLSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionVLSLFO2020 { get; set; }

    /// <summary>
    /// 惰性气体 LPGP 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionLPGP { get; set; }

    /// <summary>
    /// 惰性气体 LPGB 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionLPGB { get; set; }

    /// <summary>
    /// 惰性气体 LNG 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionLNG { get; set; }

    /// <summary>
    /// 惰性气体 Methanol 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionM { get; set; }

    /// <summary>
    /// 惰性气体 Ethanol 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionE { get; set; }

    /// <summary>
    /// 惰性气体其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float InertGasConsumptionO { get; set; }

    /// <summary>
    /// 惰性气体其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? InertGasConsumptionOType { get; set; }

    #endregion Inert Gas Consumption

    #region Incinerators Consumption

    /// <summary>
    /// 焚烧炉其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float IncineratorConsumptionO { get; set; }

    /// <summary>
    /// 焚烧炉其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? IncineratorConsumptionOType { get; set; }

    #endregion Incinerators Consumption

    #endregion Consumption

    #region ROB

    /// <summary>
    /// HFO 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float HFOROB { get; set; }

    /// <summary>
    /// LFO 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float LFOROB { get; set; }

    /// <summary>
    /// MGO 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MGOROB { get; set; }

    /// <summary>
    /// MDO 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MDOROB { get; set; }

    /// <summary>
    /// LSHFO 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float LSHFOROB { get; set; }

    /// <summary>
    /// LSLFO 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float LSLFOROB { get; set; }

    /// <summary>
    /// LSMGO 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float LSMGOROB { get; set; }

    /// <summary>
    /// ULSFO2020 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float ULSFO2020ROB { get; set; }

    /// <summary>
    /// ULSLFO2020 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float ULSLFO2020ROB { get; set; }

    /// <summary>
    /// ULSMDO2020 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float ULSMDO2020ROB { get; set; }

    /// <summary>
    /// ULSMGO2020 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float ULSMGO2020ROB { get; set; }

    /// <summary>
    /// VLSFO2020 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float VLSFO2020ROB { get; set; }

    /// <summary>
    /// VLSLFO2020 剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float VLSLFO2020ROB { get; set; }

    /// <summary>
    /// LPGP 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float LPGPROB { get; set; }

    /// <summary>
    /// LPGB 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float LPGBROB { get; set; }

    /// <summary>
    /// LNG 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float LNGROB { get; set; }

    /// <summary>
    /// Methanol 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float MethanolROB { get; set; }

    /// <summary>
    /// Ethanol 剩余量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float EthanolROB { get; set; }

    /// <summary>
    /// 其它油品剩余量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float OROB { get; set; }

    /// <summary>
    /// 其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? OROBType { get; set; }

    #endregion ROB

    #region Fuel consumption data for CII correction

    #region Cargo heating Consumption

    /// <summary>
    /// 货物加热 HFO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionHFO { get; set; }

    /// <summary>
    /// 货物加热 LFO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionLFO { get; set; }

    /// <summary>
    /// 货物加热 MGO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionMGO { get; set; }

    /// <summary>
    /// 货物加热 MDO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionMDO { get; set; }

    /// <summary>
    /// 货物加热 LSHFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionLSHFO { get; set; }

    /// <summary>
    /// 货物加热 LSLFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionLSLFO { get; set; }

    /// <summary>
    /// 货物加热 LSMGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionLSMGO { get; set; }

    /// <summary>
    /// 货物加热 ULSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionULSFO2020 { get; set; }

    /// <summary>
    /// 货物加热 ULSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionULSLFO2020 { get; set; }

    /// <summary>
    /// 货物加热 ULSMDO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionULSMDO2020 { get; set; }

    /// <summary>
    /// 货物加热 ULSMGO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionULSMGO2020 { get; set; }

    /// <summary>
    /// 货物加热 VLSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionVLSFO2020 { get; set; }

    /// <summary>
    /// 货物加热 VLSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionVLSLFO2020 { get; set; }

    /// <summary>
    /// 货物加热 LPGP 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionLPGP { get; set; }

    /// <summary>
    /// 货物加热 LPGB 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionLPGB { get; set; }

    /// <summary>
    /// 货物加热 LNG 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionLNG { get; set; }

    /// <summary>
    /// 货物加热 Methanol 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionM { get; set; }

    /// <summary>
    /// 货物加热 Ethanol 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionE { get; set; }

    /// <summary>
    /// 货物加热其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoHeatingConsumptionO { get; set; }

    /// <summary>
    /// 货物加热其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? CargoHeatingConsumptionOType { get; set; }

    #endregion Cargo heating Consumption

    #region Diesel power packs of cargo pumps Consumption

    /// <summary>
    /// DPP 货物泵 MDO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPPCargoPumpConsumptionMDO { get; set; }

    /// <summary>
    /// DPP 货物泵其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPPCargoPumpConsumptionO { get; set; }

    /// <summary>
    /// DPP 货物泵其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? DPPCargoPumpConsumptionOType { get; set; }

    #endregion Diesel power packs of cargo pumps Consumption

    #region DP Consumption

    /// <summary>
    /// DP HFO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionHFO { get; set; }

    /// <summary>
    /// DP LFO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionLFO { get; set; }

    /// <summary>
    /// DP MGO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionMGO { get; set; }

    /// <summary>
    /// DP MDO 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionMDO { get; set; }

    /// <summary>
    /// DP LSHFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionLSHFO { get; set; }

    /// <summary>
    /// DP LSLFO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionLSLFO { get; set; }

    /// <summary>
    /// DP LSMGO 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionLSMGO { get; set; }

    /// <summary>
    /// DP ULSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionULSFO2020 { get; set; }

    /// <summary>
    /// DP ULSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionULSLFO2020 { get; set; }

    /// <summary>
    /// DP ULSMDO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionULSMDO2020 { get; set; }

    /// <summary>
    /// DP ULSMGO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionULSMGO2020 { get; set; }

    /// <summary>
    /// DP VLSFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionVLSFO2020 { get; set; }

    /// <summary>
    /// DP VLSLFO2020 消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionVLSLFO2020 { get; set; }

    /// <summary>
    /// DP LPGP 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionLPGP { get; set; }

    /// <summary>
    /// DP LPGB 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionLPGB { get; set; }

    /// <summary>
    /// DP LNG 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionLNG { get; set; }

    /// <summary>
    /// DP Methanol 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionM { get; set; }

    /// <summary>
    /// DP Ethanol 消耗量（t）
    /// </summary>
    // [Required]
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionE { get; set; }

    /// <summary>
    /// DP 其它油品消耗量（t）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DPConsumptionO { get; set; }

    /// <summary>
    /// DP 其它油品类型
    /// </summary>
    [StringLength(30)]
    public string? DPConsumptionOType { get; set; }

    #endregion DP Consumption

    #endregion Fuel consumption data for CII correction

    #region Power consumption data for CII correction

    #region Reefer container

    /// <summary>
    /// 集装箱冷藏机工作量（单位：千瓦时，kWh）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float ReeferWork { get; set; }

    /// <summary>
    /// 冷藏机特定燃油消耗（单位：克/千瓦时，g/kWh）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float ReeferSFOC { get; set; }

    /// <summary>
    /// 冷藏机燃料类型
    /// </summary>
    public FuelType? ReeferFuelType { get; set; } = null;

    /// <summary>
    /// 冷藏机燃料 BDN
    /// </summary>
    [StringLength(50)]
    public string? ReeferFuelBDN { get; set; }

    #endregion Reefer container

    #region Cargo cooling

    /// <summary>
    /// 货物冷却工作量（单位：千瓦时，kWh）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoCoolingWork { get; set; }

    /// <summary>
    /// 货物冷却特定燃油消耗（单位：克/千瓦时，g/kWh）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float CargoCoolingSFOC { get; set; }

    /// <summary>
    /// 货物冷却燃料类型
    /// </summary>
    public FuelType? CargoCoolingFuelType { get; set; }

    /// <summary>
    /// 货物冷却燃料 BDN
    /// </summary>
    [StringLength(50)]
    public string? CargoCoolingFuelBDN { get; set; }

    #endregion Cargo cooling

    #region Discharge pump

    /// <summary>
    /// 卸油泵工作量（单位：千瓦时，kWh）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DischargePumpWork { get; set; }

    /// <summary>
    /// 卸油泵特定燃油消耗（单位：克/千瓦时，g/kWh）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float DischargePumpSFOC { get; set; }

    /// <summary>
    /// 卸油泵燃料类型
    /// </summary>
    public FuelType? DischargePumpFuelType { get; set; }

    /// <summary>
    /// 卸油泵燃料 BDN
    /// </summary>
    [StringLength(50)]
    public string? DischargePumpFuelBDN { get; set; }

    #endregion Discharge pump

    /// <summary>
    /// 岸电接收量（kWh）
    /// </summary>
    [FloatRound(2)]
    [Range(0, float.MaxValue)]
    public float ShoreSideElectricityReception { get; set; }

    #endregion Power consumption data for CII correction

    public void SetMEConsumptions(Dictionary<FuelType, float> consumptionDict)
    {
        foreach (var (fuelType, consumption) in consumptionDict)
        {
            switch (fuelType)
            {
                case FuelType.HFO:
                    MEConsumptionHFO = consumption;
                    break;
                case FuelType.LFO:
                    MEConsumptionLFO = consumption;
                    break;
                case FuelType.MGO:
                    MEConsumptionMGO = consumption;
                    break;
                case FuelType.MDO:
                    MEConsumptionMDO = consumption;
                    break;
                case FuelType.LSHFO:
                    MEConsumptionLSHFO = consumption;
                    break;
                case FuelType.LSLFO:
                    MEConsumptionLSLFO = consumption;
                    break;
                case FuelType.LSMGO:
                    MEConsumptionLSMGO = consumption;
                    break;
                case FuelType.ULSFO2020:
                    MEConsumptionULSFO2020 = consumption;
                    break;
                case FuelType.ULSLFO2020:
                    MEConsumptionULSLFO2020 = consumption;
                    break;
                case FuelType.ULSMDO2020:
                    MEConsumptionULSMDO2020 = consumption;
                    break;
                case FuelType.ULSMGO2020:
                    MEConsumptionULSMGO2020 = consumption;
                    break;
                case FuelType.VLSFO2020:
                    MEConsumptionVLSFO2020 = consumption;
                    break;
                case FuelType.VLSLFO2020:
                    MEConsumptionVLSLFO2020 = consumption;
                    break;
                case FuelType.LPGP:
                    MEConsumptionLPGP = consumption;
                    break;
                case FuelType.LPGB:
                    MEConsumptionLPGB = consumption;
                    break;
                case FuelType.LNG:
                    MEConsumptionLNG = consumption;
                    break;
                case FuelType.Methanol:
                    MEConsumptionM = consumption;
                    break;
                case FuelType.Ethanol:
                    MEConsumptionE = consumption;
                    break;
            }
        }
    }

    public void SetAEConsumptions(Dictionary<FuelType, float> consumptionDict)
    {
        foreach (var (fuelType, consumption) in consumptionDict)
        {
            switch (fuelType)
            {
                case FuelType.HFO:
                    AEConsumptionHFO = consumption;
                    break;
                case FuelType.LFO:
                    AEConsumptionLFO = consumption;
                    break;
                case FuelType.MGO:
                    AEConsumptionMGO = consumption;
                    break;
                case FuelType.MDO:
                    AEConsumptionMDO = consumption;
                    break;
                case FuelType.LSHFO:
                    AEConsumptionLSHFO = consumption;
                    break;
                case FuelType.LSLFO:
                    AEConsumptionLSLFO = consumption;
                    break;
                case FuelType.LSMGO:
                    AEConsumptionLSMGO = consumption;
                    break;
                case FuelType.ULSFO2020:
                    AEConsumptionULSFO2020 = consumption;
                    break;
                case FuelType.ULSLFO2020:
                    AEConsumptionULSLFO2020 = consumption;
                    break;
                case FuelType.ULSMDO2020:
                    AEConsumptionULSMDO2020 = consumption;
                    break;
                case FuelType.ULSMGO2020:
                    AEConsumptionULSMGO2020 = consumption;
                    break;
                case FuelType.VLSFO2020:
                    AEConsumptionVLSFO2020 = consumption;
                    break;
                case FuelType.VLSLFO2020:
                    AEConsumptionVLSLFO2020 = consumption;
                    break;
                case FuelType.LPGP:
                    AEConsumptionLPGP = consumption;
                    break;
                case FuelType.LPGB:
                    AEConsumptionLPGB = consumption;
                    break;
                case FuelType.LNG:
                    AEConsumptionLNG = consumption;
                    break;
                case FuelType.Methanol:
                    AEConsumptionM = consumption;
                    break;
                case FuelType.Ethanol:
                    AEConsumptionE = consumption;
                    break;
            }
        }
    }

    public void SetBoilerConsumptions(Dictionary<FuelType, float> consumptionDict)
    {
        foreach (var (fuelType, consumption) in consumptionDict)
        {
            switch (fuelType)
            {
                case FuelType.HFO:
                    BoilerConsumptionHFO = consumption;
                    break;
                case FuelType.LFO:
                    BoilerConsumptionLFO = consumption;
                    break;
                case FuelType.MGO:
                    BoilerConsumptionMGO = consumption;
                    break;
                case FuelType.MDO:
                    BoilerConsumptionMDO = consumption;
                    break;
                case FuelType.LSHFO:
                    BoilerConsumptionLSHFO = consumption;
                    break;
                case FuelType.LSLFO:
                    BoilerConsumptionLSLFO = consumption;
                    break;
                case FuelType.LSMGO:
                    BoilerConsumptionLSMGO = consumption;
                    break;
                case FuelType.ULSFO2020:
                    BoilerConsumptionULSFO2020 = consumption;
                    break;
                case FuelType.ULSLFO2020:
                    BoilerConsumptionULSLFO2020 = consumption;
                    break;
                case FuelType.ULSMDO2020:
                    BoilerConsumptionULSMDO2020 = consumption;
                    break;
                case FuelType.ULSMGO2020:
                    BoilerConsumptionULSMGO2020 = consumption;
                    break;
                case FuelType.VLSFO2020:
                    BoilerConsumptionVLSFO2020 = consumption;
                    break;
                case FuelType.VLSLFO2020:
                    BoilerConsumptionVLSLFO2020 = consumption;
                    break;
                case FuelType.LPGP:
                    BoilerConsumptionLPGP = consumption;
                    break;
                case FuelType.LPGB:
                    BoilerConsumptionLPGB = consumption;
                    break;
                case FuelType.LNG:
                    BoilerConsumptionLNG = consumption;
                    break;
                case FuelType.Methanol:
                    BoilerConsumptionM = consumption;
                    break;
                case FuelType.Ethanol:
                    BoilerConsumptionE = consumption;
                    break;
            }
        }
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var localizer =
            validationContext.GetService(typeof(IStringLocalizer<PHMEEResource>)) as IStringLocalizer<PHMEEResource>;

        if (!EnumValidationHelper.IsValidEnumValue<LogAbstractEventType>((int)Event))
        {
            yield return new ValidationResult(localizer![PHMEEEnergyEfficiencyErrorCodes.InvalidLogAbstractEventType],
                [nameof(LogAbstractEventType)]);
        }

        // ReeferFuelType
        if (ReeferFuelType is not null && !EnumValidationHelper.IsValidEnumValue<FuelType>((int)ReeferFuelType))
        {
            yield return new ValidationResult(localizer![PHMEEEnergyEfficiencyErrorCodes.InvalidFuelType],
                [nameof(ReeferFuelType)]);
        }

        // CargoCoolingFuelType
        if (CargoCoolingFuelType is not null &&
            !EnumValidationHelper.IsValidEnumValue<FuelType>((int)CargoCoolingFuelType))
        {
            yield return new ValidationResult(localizer![PHMEEEnergyEfficiencyErrorCodes.InvalidFuelType],
                [nameof(CargoCoolingFuelType)]);
        }

        // DischargePumpFuelType
        if (DischargePumpFuelType is not null &&
            !EnumValidationHelper.IsValidEnumValue<FuelType>((int)DischargePumpFuelType))
        {
            yield return new ValidationResult(localizer![PHMEEEnergyEfficiencyErrorCodes.InvalidFuelType],
                [nameof(DischargePumpFuelType)]);
        }
    }
}